package com.ym.medical.service;


import com.ym.core.redis.RedisKeyEnum;

import java.util.ArrayList;
import java.util.Set;

/**
 * 操作Redis抢单池
 *
 * @author: 李涛
 * @version: 2019年05月10日 11:01
 */
public interface IOrderPoolSV {

    /**
     * 将订单放入订单池
     *
     * @param pool    订单池
     * @param orderId 订单ID
     * @param extra   Key的额外信息
     * @return
     */
    boolean put(RedisKeyEnum pool, String orderId, String... extra);

    /**
     * 将订单取出订单池
     *
     * @param pool    订单池
     * @param orderId 订单ID
     * @param extra   Key的额外信息
     * @return
     */
    long remove(RedisKeyEnum pool, String orderId, String... extra);


    /**
     * 查询池中是否有指定订单
     *
     * @param pool    订单池
     * @param orderId 订单ID
     * @param extra   Key的额外信息
     * @return
     */
    boolean has(RedisKeyEnum pool, String orderId, String... extra);

    /**
     * 获取池中的订单数量
     *
     * @param pool  订单池
     * @param extra Key的额外信息
     * @return
     */
    long sizeByPool(RedisKeyEnum pool, String... extra);

    /**
     * 获取池中指定订单派发次数
     *
     * @param pool    订单池
     * @param orderId 订单ID
     * @param extra   Key的额外信息
     * @return
     */
    double scoreByOrder(RedisKeyEnum pool, String orderId, String... extra);

    /**
     * 获取池中未派发的订单
     *
     * @param pool  订单池
     * @param extra Key的额外信息
     * @return
     */
    Set<String> listUnPullOrders(RedisKeyEnum pool, String... extra);

    /**
     * 获取池中的所有订单
     *
     * @param pool  订单池
     * @param extra Key的额外信息
     * @return
     */
    ArrayList<String> pullAllOrders(RedisKeyEnum pool, String... extra);

    /**
     * 在池中取固定数值的订单
     *
     * @param pool    订单池
     * @param takeNum 获取数量
     * @param extra   Key的额外信息
     * @return
     */
    ArrayList<String> pullOrdersRandom(RedisKeyEnum pool, int takeNum, String... extra);


    /**
     * 扫描数据库相关订单池的订单，放入redis中，一般来说redis开了持久，不需要调用
     *
     * @param pool 订单池
     * @return
     */
    void putDbOrder2Pool(RedisKeyEnum pool);

}
